#!/bin/bash
# go-sandbox 部署脚本

# 颜色常量
COLOR_RESET='\033[0m'
COLOR_GREEN='\033[32m'
COLOR_BLUE='\033[34m'
COLOR_YELLOW='\033[33m'
COLOR_RED='\033[31m'
COLOR_CYAN='\033[36m'
COLOR_PURPLE='\033[35m'

# ASCII 艺术标题
echo -e "${COLOR_PURPLE}"
echo "   ____       ____                  _             _           "
echo "  / ___| ___ / ___|  ___ _ ____   _(_) ___ ___   | |__  _   _ "
echo " | |  _ / _ \\\___ \ / _ \ '__\ \ / / |/ __/ _ \  | '_ \| | | |"
echo " | |_| | (_) |___) |  __/ |   \ V /| | (_|  __/  | |_) | |_| |"
echo "  \____|\___/|____/ \___|_|    \_/ |_|\___\___|  |_.__/ \__, |"
echo "                                                        |___/ "
echo -e "${COLOR_RESET}"
echo -e "${COLOR_CYAN}===============================================${COLOR_RESET}"
echo -e "${COLOR_BLUE}      go-sandbox 后端部署脚本 v1.0${COLOR_RESET}"
echo -e "${COLOR_CYAN}===============================================${COLOR_RESET}"

SERVER_IP="47.109.57.7"              # 服务器IP地址
SERVER_USER="root"                   # 服务器登录用户
REMOTE_DIR="/opt/go-sandbox"         # 服务器部署目录
SERVICE_NAME="go-sandbox.service"    # systemd服务名
BUILD_DIR="./build"                  # 本地构建输出目录
PORT=5555
# 步骤0：清理并创建构建目录
echo -e "${COLOR_BLUE}[步骤0/6] 准备构建目录...${COLOR_RESET}"
rm -rf ${BUILD_DIR} && mkdir -p ${BUILD_DIR} || {
    echo -e "${COLOR_RED}[错误] 创建构建目录失败！${COLOR_RESET}"
    exit 1
}
echo -e "${COLOR_GREEN}√ 构建目录准备完成${COLOR_RESET}"

# 步骤1：构建Go二进制文件(GOARCH=amd64)
echo -e "${COLOR_BLUE}[步骤1/6] 正在构建Go二进制文件...${COLOR_RESET}"
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${BUILD_DIR}/go-sandbox || {
    echo -e "${COLOR_RED}[错误] Go二进制文件构建失败!${COLOR_RESET}"
    exit 1
}
echo -e "${COLOR_GREEN}√ 二进制文件构建完成${COLOR_RESET}"

# 步骤2：复制配置文件到构建目录
echo -e "${COLOR_BLUE}[步骤2/6] 复制配置文件...${COLOR_RESET}"
cp config.toml ${BUILD_DIR}/ || {
    echo -e "${COLOR_RED}[错误] 复制配置文件失败！${COLOR_RESET}"
    exit 1
}
echo -e "${COLOR_GREEN}√ 配置文件复制完成${COLOR_RESET}"

# 步骤3：上传文件到服务器
echo -e "${COLOR_BLUE}[步骤3/6] 上传文件到服务器...${COLOR_RESET}"
echo -e "${COLOR_BLUE}[准备] 检查并清理远程文件...${COLOR_RESET}"

# 新增：检查远程文件是否存在，存在则删除
ssh ${SERVER_USER}@${SERVER_IP} "
    if [ -f '${REMOTE_DIR}/go-sandbox' ]; then  # 检查文件是否存在[1,5](@ref)
        sudo rm -f '${REMOTE_DIR}/go-sandbox'   # 强制删除现有文件[7,9](@ref)
        echo '旧版本文件已删除'
    fi
    sudo mkdir -p '${REMOTE_DIR}'               # 确保目录存在
    sudo chown ${SERVER_USER}:${SERVER_USER} '${REMOTE_DIR}'
" || {
    echo -e "${COLOR_RED}[错误] 远程清理操作失败！${COLOR_RESET}"
    exit 1
}
scp ${BUILD_DIR}/go-sandbox ${SERVER_USER}@${SERVER_IP}:${REMOTE_DIR}/ || {
    echo -e "${COLOR_RED}[错误] 上传二进制文件失败！${COLOR_RESET}"
    exit 1
}
scp ${BUILD_DIR}/config.toml ${SERVER_USER}@${SERVER_IP}:${REMOTE_DIR}/ || {
    echo -e "${COLOR_RED}[错误] 上传配置文件失败！${COLOR_RESET}"
    exit 1
}
scp scripts/prepare_rootfs.sh ${SERVER_USER}@${SERVER_IP}:${REMOTE_DIR}/ || {
    echo -e "${COLOR_RED}[错误] 上传 prepare_rootfs.sh 失败！${COLOR_RESET}"
    exit 1
}
echo -e "${COLOR_GREEN}√ 文件上传完成${COLOR_RESET}"

# 步骤4：远程准备 rootfs（需要 root 权限）
echo -e "${COLOR_BLUE}[步骤4/6] 远程准备 rootfs...${COLOR_RESET}"
ssh ${SERVER_USER}@${SERVER_IP} "cd ${REMOTE_DIR} && sudo bash prepare_rootfs.sh" || {
    echo -e "${COLOR_RED}[错误] 远程准备 rootfs 失败！${COLOR_RESET}"
    exit 1
}
echo -e "${COLOR_GREEN}√ rootfs 准备完成${COLOR_RESET}"

# 步骤5：远程设置权限并重启服务
echo -e "${COLOR_BLUE}[步骤5/6] 配置并重启服务...${COLOR_RESET}"
ssh ${SERVER_USER}@${SERVER_IP} "
  chmod +x ${REMOTE_DIR}/go-sandbox
  echo \"[Unit]
Description=go-sandbox 后端服务
After=network.target

[Service]
Type=simple
User=${SERVER_USER}
WorkingDirectory=${REMOTE_DIR}
ExecStart=${REMOTE_DIR}/go-sandbox
Restart=always
RestartSec=5

# 资源限制
MemoryMax=512M
CPUQuota=200%

# 安全设置
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full

[Install]
WantedBy=multi-user.target\" | sudo tee /etc/systemd/system/${SERVICE_NAME} > /dev/null

  sudo systemctl daemon-reload
  sudo systemctl restart ${SERVICE_NAME}
  sudo systemctl enable ${SERVICE_NAME}
  echo -e \"\033[34m服务状态检查:\033[0m\"
  sudo systemctl status ${SERVICE_NAME} --no-pager
"

# 步骤6：本地清理
echo -e "${COLOR_BLUE}[步骤6/6] 本地清理...${COLOR_RESET}"
rm -rf ${BUILD_DIR}
echo -e "${COLOR_GREEN}√ 清理完成${COLOR_RESET}"

echo -e "${COLOR_CYAN}===============================================${COLOR_RESET}"
echo -e "${COLOR_GREEN}√ 部署完成！服务已成功启动${COLOR_RESET}"
echo -e "${COLOR_BLUE}访问地址: http://${SERVER_IP}:${PORT}${COLOR_RESET}"
echo -e "${COLOR_YELLOW}日志查看: journalctl -u ${SERVICE_NAME} -f${COLOR_RESET}"
echo -e "${COLOR_CYAN}===============================================${COLOR_RESET}"
